package com.flyu.dao.user;

import com.flyu.dao.BaseDao;
import com.flyu.pojo.User;
import com.mysql.cj.util.StringUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl implements UserDao{
    // 得到要登录的用户
    public User getLoginUser(Connection connection, String userCode) throws SQLException {
        PreparedStatement pstm = null;
        ResultSet rs = null;
        User user = null;
        if (connection != null){
            String sql = "select * from smbms_user where userCode=?";
            Object[] params = {userCode};
            rs = BaseDao.execute(connection, pstm, rs, sql, params);

             if (rs.next()){
                 user = new User();     // 必须实例化
                 user.setId(rs.getInt("id"));
                 user.setUserCode(rs.getString("userCode"));
                 user.setUserName(rs.getString("userName"));
                 user.setUserPassword(rs.getString("userPassword"));
                 user.setGender(rs.getInt("gender"));
                 user.setBirthday(rs.getDate("birthday"));
                 user.setPhone(rs.getString("phone"));
                 user.setAddress(rs.getString("address"));
                 user.setUserRole(rs.getInt("userRole"));
                 user.setCreatedBy(rs.getInt("createdBy"));
                 user.setCreationDate(rs.getTimestamp("creationDate"));
                 user.setModifyBy(rs.getInt("modifyBy"));
                 user.setModifyDate(rs.getTimestamp("modifyDate"));
             }
             BaseDao.closeResource(null, pstm, rs);
        }
        return user;

    }
    // 根据id查询用户
    public User getUserById(Connection connection, int id) throws SQLException {
        PreparedStatement pstm = null;
        ResultSet rs = null;
        User user = null;
        if (connection != null){
            String sql = "select u.*, r.roleName as userRoleName from smbms_user u, smbms_role r where u.id = ? and u.userRole = r.id";
            Object[] params = {id};
            rs = BaseDao.execute(connection, pstm, rs, sql, params);
            if (rs.next()){
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUserCode(rs.getString("userCode"));
                user.setUserName(rs.getString("userName"));
                user.setUserPassword(rs.getString("userPassword"));
                user.setGender(rs.getInt("gender"));
                user.setBirthday(rs.getDate("birthday"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                user.setUserRole(rs.getInt("userRole"));
                user.setCreatedBy(rs.getInt("createdBy"));
                user.setCreationDate(rs.getTimestamp("creationDate"));
                user.setModifyBy(rs.getInt("modifyBy"));
                user.setModifyDate(rs.getTimestamp("modifyDate"));

                user.setUserRoleName(rs.getString("userRoleName"));
            }
            BaseDao.closeResource(null, pstm, rs);
        }
        return user;
    }
    // 修改当前用户密码
    public int updatePwd(Connection connection, int id, String password) throws SQLException {
        PreparedStatement pstm = null;
        int execute = 0;

        if (connection!=null){
            String sql = "update smbms_user set userPassword=? where id=?";
            Object[] params = {password, id};
            // 调用DAO层执行sql
            execute = BaseDao.execute(connection, pstm, sql, params);
            // 关闭资源
            BaseDao.closeResource(null, pstm, null);
        }
        return execute;
    }
    // 根据用户名或角色查询用户总数
    public int getUserCount(Connection connection, String username, int userRole) throws SQLException {
        PreparedStatement pstm = null;
        ResultSet rs = null;
        int count = 0;

        ArrayList<Object> list = new ArrayList<Object>();   // 存放参数

        if (connection!=null){
            StringBuffer sql = new StringBuffer();
            sql.append("select count(1) as count from smbms_user u,smbms_role r where u.userRole = r.id");

            if (!StringUtils.isNullOrEmpty(username)){
                sql.append(" and u.username like ?");   // 注意前面空格
                list.add("%"+username+"%");     // index: 0
            }
            if (userRole > 0){
                sql.append(" and u.userRole = ?");      // 注意前面空格
                list.add(userRole);     // index: 1
            }
            Object[] params = list.toArray();
            System.out.println("UserDaoImpl-->getUserCount: "+sql.toString());  // 输出完整的sql语句
            rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);

            if (rs.next()){
                count = rs.getInt("count"); // 从结果集中获取最终数量
            }
            BaseDao.closeResource(null, pstm, rs);
        }
        return count;
    }
    // 获取用户列表
    public List<User> getUserList(Connection connection, String username, int userRole, int currentPageNo, int pageSize) throws SQLException {
        PreparedStatement pstm = null;
        ResultSet rs = null;
        List<User> userList = new ArrayList<User>();

        if (connection != null){
            StringBuffer sql = new StringBuffer();
            sql.append("select u.*, r.roleName as userRoleName from smbms_user u, smbms_role r where u.userRole = r.id");

            List<Object> list = new ArrayList<Object>();    // 存放参数
            if (!StringUtils.isNullOrEmpty(username)){
                // username非空
                sql.append(" and u.userName like ?");
                list.add("%"+username+"%");
            }
            if (userRole>0){
                sql.append(" and u.userRole = ?");
                list.add(userRole);
            }
            sql.append(" order by creationDate DESC limit ?,?");
            currentPageNo = (currentPageNo-1)*pageSize; // 下页起始位置
            list.add(currentPageNo);
            list.add(pageSize);
            Object[] params = list.toArray();
            System.out.println("UserDaoImpl-->getUserList:"+sql.toString());
            rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
            while (rs.next()){
                User _user = new User();
                _user.setId(rs.getInt("id"));
                _user.setUserCode(rs.getString("userCode"));
                _user.setUserName(rs.getString("userName"));
//                _user.setUserPassword(rs.getString("userPassword"));
                _user.setGender(rs.getInt("gender"));
                _user.setBirthday(rs.getDate("birthday"));
                _user.setPhone(rs.getString("phone"));
//                _user.setAddress(rs.getString("address"));
                _user.setUserRole(rs.getInt("userRole"));
//                _user.setCreatedBy(rs.getInt("createdBy"));
//                _user.setCreationDate(rs.getTimestamp("creationDate"));
                _user.setUserRoleName(rs.getString("userRoleName"));
                userList.add(_user);
            }
            BaseDao.closeResource(null, pstm, rs);

        }
        return userList;

    }
    // 添加用户
    public int addUser(Connection connection, User user) throws SQLException {
        PreparedStatement pstm = null;
        int execute = 0;
        if (connection != null){
            String sql = "insert into smbms_user (userCode, userName, userPassword, gender, birthday, phone, address, userRole, creationDate, createdBy) values (?,?,?,?,?,?,?,?,?,?)";
            Object[] params = {user.getUserCode(), user.getUserName(), user.getUserPassword(),
                    user.getGender(), user.getBirthday(), user.getPhone(), user.getAddress(),
                    user.getUserRole(), user.getCreationDate(), user.getCreatedBy()};
            execute = BaseDao.execute(connection, pstm, sql, params);
        }
        BaseDao.closeResource(null, pstm, null);
        return execute;
    }
    // 删除用户
    public int delUser(Connection connection, int uid) throws SQLException {
        PreparedStatement pstm = null;
        int execute = 0;

        if (connection != null){
            String sql = "delete from smbms_user where id = ?";
            Object[] params = {uid};
            execute = BaseDao.execute(connection, pstm, sql, params);
        }
        BaseDao.closeResource(null, pstm, null);
        return execute;
    }
    // 保存修改
    public int modifySave(Connection connection, Object[] params) throws SQLException {
        PreparedStatement pstm = null;
        int execute = 0;
        if (connection != null){
            String sql = "update smbms_user set userName=?, gender=?, birthday=?, phone=?, address=?, userRole=? where id=?";
            execute = BaseDao.execute(connection, pstm, sql, params);
            BaseDao.closeResource(null, pstm, null);
        }
        return execute;
    }

}
